package uestc.lj.midPromotion.pretreatment;

/**
 * @Author:Crazlee
 * @Date:2021/11/30
 */
public class Code03_Rand5ToRand7 {
	/**
	 * 等概率返回1~5的一个数字
	 *
	 * @return
	 */
	public static int f() {
		return (int) (Math.random() * 5) + 1;
	}

	/**
	 * 等概率返回0和1的函数
	 * 利用等概率返回1到5的函数
	 * 1,2返回0
	 * 4,5返回1
	 *
	 * @return
	 */
	public static int random0To1() {
		int res = 0;
		do {
			res = f();
		} while (res == 3);
		return res < 3 ? 0 : 1;
	}

	/**
	 * 等概率返回1到7的数字
	 * 用3个二进制位表示
	 * 等概率返回0到6，然后加1即可
	 *
	 * @return
	 */
	public static int random1To7() {
		int res = 0;
		do {
			res = (random0To1() << 2) + (random0To1() << 1) + random0To1();
		} while (res == 7);
		return res + 1;
	}

	/**
	 * 以p的概率返回0
	 *
	 * @return
	 */
	public static int random0To1p() {
		double p = 0.83;
		return Math.random() < p ? 0 : 1;
	}

	/**
	 * 利用01、10等概率生成0和1
	 * 因为这样概率都是p(1-p)
	 *
	 * @return
	 */
	public static int rand01() {
		int num;
		do {
			num = random0To1p();
		} while (num == random0To1p());
		return num;
	}

}
